/* 
 * File:   Expression.h
 * Author: Gab'z
 *
 * Created on 29 mai 2012, 12:25
 */

#ifndef EXPRESSION_H
#define	EXPRESSION_H

#include "Constant.h"
#include <list>

namespace calculator {

    /**
     * Classe Expression, composée de Command.
     * Une expression se construit avec au minimum une commande, on peut lui 
     * en ajouter et en retirer
     */
    class Expression : public Constant {
    public:

        /**
         * Constructeur de Expression.
         * Copie la commande dans l'expression.
         * @param command
         */
        Expression(const Command* command);

        /**
         * Constructeur de Expression.
         * Concatène les commandes en une expression, tient compte de 
         * la présence d'expressions dans la première commande,
         * la dernière ne devant pas être une nouvelle expression.
         * @param command1 une Command.
         * @param command2 une Command hors Expression.
         */
        Expression(const Command* command1, const Command* command2);

        /**
         * Constructeur de Expression.
         * Concatène les commandes en une expression, tient compte de 
         * la présence d'expressions dans les deux premières commandes,
         * la dernière ne devant pas être une expression.
         * @param command1 une Command.
         * @param command2 une Command.
         * @param command3 une Command hors Expression.
         */
        Expression(const Command* command1, const Command* command2, const Command* command3);

        /**
         * Constructeur de Expression.
         * Concatène les deux expressions et la commande en une nouvelle expression.
         * @param exp1 une Expression.
         * @param exp2 une Expression.
         * @param command une Command hors Expression.
         */
        Expression(const Expression* exp1, const Expression* exp2, const Command* command);

        /**
         * Destructeur de Expression.
         * Libère la mémoire utilisée par les Command qui la composent
         */
        virtual ~Expression();

        /*
         * Clone l'expression avec son contenu.
         * @return une copie de l'expression
         */
        Expression* clone() const;

        /**
         * Traduit l'expression en std::string
         * @return l'ensemble des commandes séparées par un espace, le tout est
         * encadré du début à la fin par le caractère '.
         */
        std::string toString() const;

        /**
         * Ajoute une commande à la fin de l'expression
         * @param command la commande à ajouter
         */
        void append(const Command* command);

        /**
         * getter vers la première Command contenue dans l'expression
         * @return la première Command contenue dans l'expression
         */
        const Command* getFirstCommand() const;

        /**
         * supprime la première Command contenue dans l'expression
         */
        void removeFirstCommand();

        /**
         * Permet de savoir si l'expression contient au moins une Command
         * @return true s'il n'y a aucune Constant, faux sinon
         */
        bool empty() const;
    private:

        /**
         * Conteneur de Command constituant l'expression
         */
        std::list<const Command*> _expression;

        /**
         * Constructeur d'Expression privé.
         * Autorise la création d'Expression vide pour le clonage ou les manipulations
         */
        Expression();
    };
}

#endif	/* EXPRESSION_H */

